package threadlocal;

/**
 * Created by zhj on 15-11-12.
 *
 * 内存泄漏可能的情形：
 *  1 静态容器(两种可能情形)
 *      1.1 实体对象  当缓存用 但是不能无限制往里放，需要超过一定限制后，进行策略控制，如lru删除,或磁盘写入
 *      1.2 具有生命周期的对象,如task,事物等，当状态为结束的时候，一定要从map中删除
 *  2  还有一种就是ThreadLocal，在使用完后没有进行set(null)操作,对于县城复用的情况下，该value会一直等到线程退出才能释放
 */

/**
 * 1 每个线程都有个ThreadLocal.ThreadLocalMap threadLocals属性，该对象数据结构为Entry[],
 //Entry继承自WeakReference,扩充属性Object value
 2 threadLocal.set("abc")最终会将数据存入当前线程的localMap的entry的value中,
      在数组的定位中,为每个ThreadLocal实例分配一个hashcode，然后hash化到一个数组下标，如果冲突,则开始线性探测
        每个Entry持有value和对应的threadLocal引用
 */
public class TestThreadLocal {
    static ThreadLocal<String> threadLocal=new ThreadLocal<>();
    static ThreadLocal<Integer> threadLocal1=new ThreadLocal<>();
    public static void main(String[] args) {
        //这句话底层会拿到当前线程的内部数据结构map  并将threadLocal做为key,"abc"作为value存储到线程map中
        threadLocal.set("abc");
        threadLocal1.set(23);
        threadLocal1.get();
        Thread current=Thread.currentThread();//currentThread为native方法，获取到执行当前代码的线程
        System.out.println();
    }
}
